package com.chen.base.utils;

import com.chen.root.enums.DriveEnum;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: Long
 * @date: 2023/10/29 13:32
 **/
@Slf4j
public class JdbcUtil {

    /**
     * 原生JDBC的方式查询记录
     * todo 用于存储查询结果的实体类对象属性，目前属性暂时只支持 String
     * @param sql sql语句
     * @param dsType 数据源类型{@link DriveEnum}
     * @param url 数据源url地址
     * @param username 账号
     * @param password 密码
     * @param tClass 用于存储查询结果的实体类对象
     * @return 结果集
     */
    public static <T> List<T> select(String sql, String dsType, String url, String username, String password, Class<T> tClass){
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;

        List<T> list = new ArrayList<>();
        try {
            log.info("\nData-Source url -> {} \nData-Source sql -> {}\n", url, sql);
            // 1、注册驱动
            Class.forName(DriveEnum.getDrive(dsType));
            // 2、连接数据库
            conn = DriverManager.getConnection(url, username, password);
            stat = conn.createStatement();
            // 3、执行sql
            rs = stat.executeQuery(sql);
            // 4、遍历结果
            while (rs.next()) {
                T t = tClass.newInstance();
                for (Field field : tClass.getDeclaredFields()) {
                    field.setAccessible(true);
                    String value = rs.getString(field.getName());
                    field.set(t, value);
                }

                list.add(t);
            }
        } catch (Exception e){
            log.error("", e);
        } finally {
            try { // 释放资源
                if (conn != null){
                    conn.close();
                }
                if (stat != null){
                    stat.close();
                }
                if (rs != null){
                    rs.close();
                }
            }catch (Exception ignored){}
        }

        return list;
    }

    /**
     * 原生JDBC的方式测试连接数据源
     * @param dataType 数据源类型{@link DriveEnum}
     * @param url 数据源url地址
     * @param username 账号
     * @param password 密码
     */
    public static void testConnect(String dataType, String url, String username, String password) throws Exception {
        Class.forName(DriveEnum.getDrive(dataType));
        Connection conn = DriverManager.getConnection(url, username, password);
        conn.close();
    }
}
